////动态类型转换：基类类型指针转换为子类类型指针
////				基类类型引用转换为子类类型引用
//#include <iostream>
//using namespace std;
//class A { //编译器根据A类型信息，将制作一张虚函数表 “A”...A::foo的地址
//public:
//	virtual void foo() {}
//
//};
//class B:public A{//编译器根据B类型信息，将制作一张虚函数表 “B”...A::foo的地址
//};
//class C:public B{};//编译器根据C类型信息，将制作一张虚函数表 “C”...A::foo的地址
//class D{};//编译器根据D类信息，不制作虚函数表
//
//int main(void) {
//	B b;// |虚表指针| -->编译器根据B类信息制作的虚函数表
//	A* pa = &b;//B*-->A* (子类类型指针 ==>基类类型指针)
//
//	cout << "------------dynamic_cast 运行期间做的转换------" << endl;
//	B* pb = dynamic_cast<B*>(pa);// pa-->b对象所占内存空间-->虚表指针->编译器根据B类信息制作的虚函数表-->"B"
//	cout << "A* pa-->B* pb:" << pb << endl;
//
//	C* pc = dynamic_cast<C*>(pa);// pa-->b对象所占内存空间-->虚表指针->编译器根据B类信息制作的虚函数表-->"B"
//	cout << "A* pa-->C* pb:" << pc << endl;
//	D* pd = dynamic_cast<D*>(pa);// pa-->b对象所占内存空间-->虚表指针->编译器根据B类信息制作的虚函数表-->"B"
//	cout << "A* pa-->D* pb:" << pd << endl;
//
//
//	cout << "------------static_cast编译期间做的转换------" << endl;
//	pb = static_cast<B*>(pa);//即合理又安全 A* -->B*的反向 可以隐式转换
//	cout << "A* pa-->B* pb:" << pb << endl;
//
//	pc = static_cast<C*>(pa);//有风险 A*-->C*的反向 可以隐式转换
//	cout << "A* pa-->C* pb:" << pc << endl;
//	//pd = static_cast<D*>(pa);//不合理 A*-->D*的反向，不可以隐式转换
//	//cout << "A* pa-->D* pb:" << pd << endl;
//
//	return 0;
//}